今天要來做的是一個酷炫的特效,當滑鼠移動的時候,字的陰影也會跟著移動
第一步要做的是抓取滑鼠所在的位置
const hero = document.querySelector('.hero');
const text = hero.querySelector('h1');
function shadow(e) {
const { offsetWidth: width, offsetHeight: height } = hero;
let { offsetX: x, offsetY: y } = e;
console.log(width, height);
console.log(x, y);
}
hero.addEventListener('mousemove', shadow);
首先要做的當然是選定元素跟綁定監聽器
接下來,要使用JS的解構賦值(Destructuring Assignment),今天用的是物件解構
解構賦值 (Destructuring assignment) 語法是一種 JavaScript 運算式,可以把陣列或物件中的資料解開擷取成為獨立變數
e.g.
const { offsetWidth: width, offsetHeight: height } = hero;
//相當於
const width = hero.offsetWidth;
const height = hero.offsetHeight;
完成後就可以讀取滑鼠的座標
做完第一步後,有沒有發現一個問題,當滑鼠經過某一個區域時,座標會突然變小?
這是因為當被監聽的元素有子元素的時候,它會回傳游標在子元素上的位置,如上圖的紅色區塊
function shadow(e) {
// ...
if (this !== e.target) {
x = x + e.target.offsetLeft;
y = y + e.target.offsetTop;
}
}
所以要加上上面這段程式碼,它的作用是當游標的位置不在監聽的元素上,要為現在的座標加上子元素到父元素的距離
最後一步是要幫文字加上陰影
function shadow(e) {
// ...
const walk = 500;
const xWalk = Math.round((x / width * walk) - (walk / 2));
const yWalk = Math.round((y / height * walk) - (walk / 2));
text.style.textShadow = `
${xWalk}px ${yWalk}px 0 red,
${xWalk * -1}px ${yWalk}px 0 blue,
${xWalk}px ${yWalk * -1}px 0 green,
${xWalk * -1}px ${yWalk * -1}px 0 yellow
`;
}
首先要定義陰影移動的最大距離,根據上面的範例程式碼,設定陰影移動的距離為500px
接下來就要計算陰影移動距離,這邊以座標和畫面寬、高算出陰影移動的比例後,要再減去最大移動距離的一半,這是因為陰影可移動的距離加總才會是可移動的最大距離,以上方程式碼為例,移動的範圍是+250~-250
最後再將計算完的結果作為陰影的參數套用就完成了